Activity的finish过程分析
废话不多说了,直接上代码。==。
1 | // Activity.java |
Activity的finish过程会通过Binder调用到AMS的finishActivity。
1 |
|
finishActivity调用到ActivityRecord对应的ActivityStack中的requestFinishActivityLocked。紧接着再调用finishActivityLocked。
1 | //frameworks/base/services/java/com/android/server/am/ActivityStack.java |
finishActivityLocked通过startPauseingLocked方法来暂停当前的activity。
1 | final void startPausingLocked(boolean userLeaving, boolean uiSleeping) { |
startPausingLocked方法负责暂停当前activity,它通过IApplicationThread这个Binder代理调用schedulePauseActivity通知应用端暂停当前activity。
1 | private void handlePauseActivity(IBinder token, boolean finished, |
schedulePauseActivity调用handlePauseActivity方法来执行暂停过程,这里会回调Activity生命周期的onPause方法,完成暂停后通过activityPaused方法通知AMS。
1 | //activity被暂停后 通知AMS已经执行完毕 |
AMS的activityPaused通过ActivityStack的activityPausedLocked方法来完成进一步完成暂停Activity的工作。随后进一步调用completePauseLocked。
1 | //完成暂停动作后的逻辑 |
1 | //finish当前activity |
completePauseLocked完成activity暂停的工作,这里的mPausingActivity就是当前finish的activity,由于是主动finish的,这里的prev.finishing为true,通过finishCurentActivityLocked完成暂停的工作,随后resumeTopActivitiesLocked启动当前栈顶的activity。这一部分工作在activity的启动过程有所介绍,这里不展开说明。这一流程会导致栈顶activity调用onRestart,onStart,onResume过程。我们看下acitivty执行onResume完成后会做什么。
1 | final void handleResumeActivity(IBinder token, boolean clearHide, boolean isForward, |
activity处理resume过程中会在当前主线程的MessageQueue中添加一个addIdleHandler,这个handler的回调在MessageQueue中没有可以处理的消息后进行调用,而在回调中调用了AMS的activityIdle,这个方法开始处理前一个activity的finish的收尾工作。
1 |
|
1 | final ActivityRecord activityIdleInternalLocked(final IBinder token, boolean fromTimeout, |
1 | final boolean destroyActivityLocked(ActivityRecord r, |
destroyActivityLocked中主要就是通知应用端进行onStop,onDestroy生命周期的回调。